package com.obelisco.vista.componentes;

import java.util.List;
import java.util.Map;

import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Insets;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.vista.plantillas.VentanaBase;

import echopointng.ContainerEx;
import echopointng.layout.DisplayLayoutData;

public class CatalogoListaBase extends VentanaBase {

	private ContainerEx paneSuperior;
	private PaneBusquedaBase paneBusquedaBase;
	private TablaDatosSimple tabla;
	private Map<String, String> camposMostrar;
	private ContenedorBusqueda contenedorBusqueda;

	private Object objetoEntidad;
	private TipoFuncion tipoFuncion;
	private String nombreFuncion;
	private TipoAccion accionSeleccionada;
	
	public VentanaListener eventosVentana = new VentanaListener() {
		public void onMostrar(Ventana ventana) {
			if (contenedorBusqueda != null) {
				paneBusquedaBase.inicializar();			
				tabla.clearSelection();
				tabla.setItems(contenedorBusqueda.buscar(),camposMostrar,null);
			}
			else {
				paneSuperior.removeAll();
			}			
		}

		public void onSalir(Ventana ventana, boolean cerrar) {
			cerrar = true;
		}
	};

	public PaneBusquedaListener eventosPaneBusqueda = new PaneBusquedaListener() {
		public void resultadoBusqueda(List datos) {
			tabla.setItems(datos, camposMostrar, null);
		}
	};

	
	public CatalogoListaBase() {
		super("Catalogo", TipoVentana.DIALOGO);
		this.addVentanaListener(eventosVentana);
		initComponents();
	}
	
	private void initComponents() {		
		ContainerEx contenedor = new ContainerEx();
		TabPaneLayoutData contenedorLayoutData = new TabPaneLayoutData();
		contenedorLayoutData.setTitle("Catalogo");
		contenedor.setLayoutData(contenedorLayoutData);

		// Se agrega el Container donde va a estar ubicado el Panel de Busqueda
		paneSuperior = new ContainerEx();

		paneBusquedaBase = new PaneBusquedaBase();
		paneBusquedaBase.addPaneBusquedaListener(eventosPaneBusqueda);

		DisplayLayoutData layoutData = new DisplayLayoutData();
		layoutData.setOutsets(new Insets(new Extent(10)));
		Alignment alineacion = new Alignment(Alignment.LEADING, Alignment.TOP);
		layoutData.setAlignment(alineacion);
		paneBusquedaBase.setLayoutData(layoutData);

		paneSuperior.add(paneBusquedaBase);

		contenedor.add(paneSuperior);

		tabla = new TablaDatosSimple();
		tabla.setSeleccionMultiple(false);
		layoutData = new DisplayLayoutData();
		layoutData.setOutsets(new Insets(new Extent(10)));

		alineacion = new Alignment(Alignment.LEADING, Alignment.TOP);
		layoutData.setAlignment(alineacion);
		tabla.setLayoutData(layoutData);
		contenedor.add(tabla);
		
		this.getAreaTrabajo().add(contenedor);

		this.getAreaTrabajo().setEnabled(true);
	}

	public void setItems(List datos) {
		tabla.clearSelection();
		tabla.setCantidadFilas(datos.size());
		tabla.setItems(datos, camposMostrar, null);
	}

	@Override
	protected void accion(TipoAccion accion, TipoFuncion funcion, String nombre) {
		accionSeleccionada = accion;
		if (accion == accion.ACEPTAR) {
			if (tabla.getFilasSeleccionadas() == null) {
				DialogoError.mostrar("Error", 102);
			} 
			else {
				this.setObjetoEntidad(tabla.getFilasSeleccionadas());
				if (onValidarDatos(getObjetoEntidad(),getTipoFuncion(), getNombreFuncion())) {
					onConfirmarCambios(getObjetoEntidad(), getTipoFuncion(), getNombreFuncion());
					this.salir();
				}				
			}
		} else if (accion == accion.CANCELAR) {
			this.salir();
		}
	}

	@Override
	protected void funcion(TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
	}

	public void setContenedorBusqueda(ContenedorBusqueda contenedorBusqueda) {	
		this.contenedorBusqueda = contenedorBusqueda;
		this.paneBusquedaBase.setContenedorBusqueda(contenedorBusqueda);
		addComponenteDatosListener((ComponenteDatosListener) contenedorBusqueda);
	}

	public Map<String, String> getCamposMostrar() {
		return camposMostrar;
	}

	public void setCamposMostrar(Map<String, String> camposMostrar) {
		this.camposMostrar = camposMostrar;
	}

	public ContenedorBusqueda getContenedorBusqueda() {
		return contenedorBusqueda;
	}
	
	public TipoFuncion getTipoFuncion() {
		return tipoFuncion;
	}

	public void setTipoFuncion(TipoFuncion tipoFuncion) {
		this.tipoFuncion = tipoFuncion;
	}

	public TipoAccion getAccionSeleccionada() {
		return accionSeleccionada;
	}

	public void setAccionSeleccionada(TipoAccion accionSeleccionada) {
		this.accionSeleccionada = accionSeleccionada;
	}
	
	public String getNombreFuncion() {
		return nombreFuncion;
	}

	public void setNombreFuncion(String nombreFuncion) {
		this.nombreFuncion = nombreFuncion;
	}

	public void transferirEntidad(Object object) {
		setObjetoEntidad(object);
	}
	
	public Object getObjetoEntidad() {
		// TODO Auto-generated method stub
		return objetoEntidad;
	}
		
	public void inicializar() {
		// TODO Auto-generated method stub		
		distribuirEventoInicializar();		
	}

	private void distribuirEventoInicializar() {
		for (ComponenteDatosListener l : listeners) {
			l.onInicializar();
		}
	}	

	public void onConfirmarCambios(Object objeto, TipoFuncion funcion,
			String nombre) {
		// TODO Auto-generated method stub
		distribuirEventoConfirmarCambios(objeto, funcion, nombre);
	}
	
	private void distribuirEventoConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {
		for (ComponenteDatosListener l : listeners) {
			l.onConfirmarCambios(objeto, tipo, nombre);
		}
	}

	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoConsultar(objeto);
	}

	private void distribuirEventoConsultar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onConsultar(objeto);
		}
	}

	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoIncluir(objeto);
	}

	private void distribuirEventoIncluir(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onIncluir(objeto);
		}
	}

	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		distribuirEventoModificar(objeto);
	}
	
	private void distribuirEventoModificar(Object objeto) {
		for (ComponenteDatosListener l : listeners) {
			l.onModificar(objeto);
		}
	}
	
	public boolean onValidarDatos(Object objeto, TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
		return distribuirEventoValidarDatos(objeto,funcion,nombre);
	}
	
	private boolean distribuirEventoValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		boolean validarDatos = true;
		for (ComponenteDatosListener l : listeners) {
			if (!l.onValidarDatos(objeto, tipo, nombre)) {
				validarDatos = false;
			}
		}
		return validarDatos;
	}
	
	public void setObjetoEntidad(Object objetoEntidad) {
		// TODO Auto-generated method stub
		this.objetoEntidad = objetoEntidad;
		distribuirEventoObjetoEntidad(objetoEntidad);		
 	}
 	
	private void distribuirEventoObjetoEntidad(Object object) {
		for (ComponenteDatosListener l : listeners) {
			l.onObjetoEntidad(object);
		}
	}

	public void addComponenteDatosListener(ComponenteDatosListener listener) {
		listeners.add(listener);
	}
	
	public void removeCatalogoListener(ComponenteDatosListener listener) {
		listeners.remove(listener);
	}
	
}
